package game.data;

import game.data.RoleAttrData;
import hx.display.BlendMode;
import game.data.ActionData.ActionType;

typedef ABProjectData = {
	var eventTag:String;
	var offestConfig:Dynamic<{
		x:Float,
		y:Float
	}>;
	var atlas:Array<String>;
	var actions:Dynamic<ABActionData>;
	var attrData:ABRoleAttrData;
	var data:Dynamic;

	/**
	 * 编辑器版本号
	 */
	var editerVersion:String;

	/**
	 * 构建版本号
	 */
	var buildVersion:String;
}

typedef ABActionData = {
	var frames:Array<ABFrameData>;
	var name:String;
	var desc:String;
	var mpConsume:Int;
	var hpConsume:Int;
	var effortConsume:Int;
	var cd:Int;
	// var eventTag:String;
	var fps:Int;
	var type:ActionType;
	var allowAirMove:Bool;
	var diabledForce:Bool;
	var airGravity:Float;
	var groupKeys:Array<Int>;
}

typedef ABFrameData = {
	var eventTag:String;
	var name:String;
	var moveX:Null<Float>;
	var moveY:Null<Float>;
	var rotate:Null<Float>;
	var scaleX:Null<Float>;
	var scaleY:Null<Float>;
	var alpha:Null<Float>;
	var pointX:Null<Float>;
	var pointY:Null<Float>;
	var collision:Array<ABCollision>;
	var collisionLiveTime:Float;
	var hitData:ABHitData;
	var isStop:Bool;
	var stopAction:String;
	var effects:Array<ABEffectData>;
	var sound:String;
	var shareCollision:Bool;

	/**
	 * 震动强度
	 */
	var shakeIntensity:Float;

	/**
	 * 震动持续时间
	 */
	var shakeDuration:Float;

	/**
	 * 震动频率
	 */
	var shakeFrequency:Float;

	/**
	 * 无敌时间
	 */
	var invincibleTime:Float;

	/**
	 * 霸体时间
	 */
	var stoicTime:Float;
}

typedef ABCollision = {
	var type:ABCollisionType;
	var ?points:Array<Array<Float>>;
	var ?radius:Float;
}

enum abstract ABCollisionType(String) to String from String {
	var POLYGON = "Polygon";
	var CIRCLE = "Circle";
}

typedef ABEffectData = {
	var x:Float;
	var y:Float;
	var scaleX:Float;
	var scaleY:Float;
	var rotation:Float;
	var fps:Int;
	var displayName:String;
	var name:String;
	var script:String;
	var blendMode:BlendMode;
	// var colorMatrixFilter:Array<Float>;
	var sound:String;
	var liveTime:Float;
	var speed:{
		x:Float,
		y:Float
	};
	var isFlyProp:Bool;
	var isHitClean:Bool;
	var isLockAction:Bool;
	var isFollow:Bool;
	var startFrame:Int;
	var frames:Array<FrameData>;

	/**
	 * 是否应用颜色变换
	 */
	var isApplyColorTranform:Bool;

	/**
	 * 红色
	 */
	var R:Float;

	/**
	 * 绿色
	 */
	var G:Float;

	/**
	 * 蓝色
	 */
	var B:Float;

	/**
	 * 红色偏移
	 */
	var ROffset:Float;

	/**
	 * 绿色偏移
	 */
	var GOffset:Float;

	/**
	 * 蓝色偏移
	 */
	var BOffset:Float;
}

typedef ABHitData = {
	/**
	 * 伤害系数
	 */
	var damageScale:Float;

	/**
	 * 击中事件
	 */
	var eventTag:String;

	/**
	 * 攻击类型
	 */
	var attackType:AttackType;

	/**
	 * 卡帧持续时间（如果没有填，则读取`stopFrameTimeEnemy`）
	 */
	var stopFrameTimeSelf:Float;

	/**
	 * 卡帧持续时间
	 */
	var stopFrameTimeEnemy:Float;

	/**
	 * 是否应用在角色卡帧中，默认为`true`，如果为`false`，则仅卡帧特效，而不会影响到英雄
	 */
	var applyRoleStopFrame:Bool;

	/**
	 * 击中后产生的击退效果，对应X轴
	 */
	var hitMoveX:Float;

	/**
	 * 击中后产生的击飞效果，对应Y轴
	 */
	var hitMoveY:Float;

	/**
	 * 击中后产生僵直时间
	 */
	var stiffenTime:Float;

	/**
	 * 是否为重击攻击，如果为重击攻击，会产生强力的卡帧效果，并会造成击飞效果
	 */
	var isBlow:Bool;

	/**
	 * 击中颜色
	 */
	var hitColor:String;

	/**
	 * 是否破坏防御
	 */
	var isDestroyDefense:Bool;

	/**
	 * 碰撞体产生的坐标点X
	 */
	var createX:Float;

	/**
	 * 碰撞体产生的坐标点Y
	 */
	var createY:Float;

	/**
	 * 该攻击是否被防御
	 */
	var isDefense:Bool;

	/**
	 * 击中时触发的音频
	 */
	var sound:String;

	/**
	 * 击中时产生的击中特效，如果没有则使用默认的击中特效
	 */
	var hitEffectId:String;

	/**
	 * 攻击时产生的击中效果
	 */
	var hitBlowEffectId:String;

	/**
	 * 攻击间隔，每次攻击刷新的间隔时间
	 */
	var attackInterval:Float;

	/**
	 * 最大攻击次数
	 */
	var maxTimes:Int;

	/**
	 * 震动强度
	 */
	var shakeIntensity:Float;

	/**
	 * 震动持续时间
	 */
	var shakeDuration:Float;

	/**
	 * 震动频率
	 */
	var shakeFrequency:Float;
}

typedef ABRoleAttrData = {
	/**
	 * 移动速度
	 */
	var speed:Float;

	/**
	 * 缩放
	 */
	var scale:Float;

	/**
	 * 跳跃高度
	 */
	var jump:Float;

	/**
	 * 生命值系数
	 */
	var hp:Float;

	/**
	 * 攻击力系数
	 */
	var attack:Float;

	/**
	 * 魔法系数
	 */
	var magic:Float;

	/**
	 * 能量系数
	 */
	var energy:Float;

	/**
	 * 物理防御系数
	 */
	var attackDefense:Float;

	/**
	 * 魔法防御系数
	 */
	var magicDefense:Float;

	/**
	 * 攻击特效
	 */
	var hitEffectId:String;

	/**
	 * 攻击时产生的击中效果
	 */
	var hitBlowEffectId:String;

	/**
	 * 代码脚本ID
	 */
	var script:String;

	/**
	 * 击中音效
	 */
	var hitSound:String;

	/**
	 * 重击击中音效
	 */
	var hitSound2:String;
}
